Kalixのサンプルcustomer regstory sampleをローカルで動かしてみる
はじめに
最近リブランドされたPaaS Kalix(以前のakka serverless)が面白そうだったのでローカルでサンプルコードを実行してみました。
Kalixとは
Kalixについてはこちらの記事が詳しいです。
サンプルCustomer Registory
今回の記事は公式ドキュメントのQuickStartの内容をベースにしています。
コードの取得
kalixコマンドでサンプルコードを取得します。
kalix quickstart download customer-registry-scala
ここで取得できるコードはこのリポジトリと同等の内容に思えます。
注意: 今回はローカルで上記のサンプルを実行します。オンラインのドキュメントには「Run a service locally」というページもありますが、このページで対象としているサンプルはCustomer Registory Scalaとは内容が異なるのでこのページのcurlやgrpcurlのスニペットは動作しません。
起動するまで
基本的にはREADMEの内容に従って実行していけばいいのですがいくつかpitfallがあったので紹介します。
Javaのバージョンは11以降にすること
WEBのQuickStartには記載があるのですがREAD MEには記載がないので見落としがちです。
- Docker 20.10.8 or higher
- Java 11 or higher
- sbt 1.4 or higher
- grpcurl
サンプルコードを実行するだけなら.sbtoptsで指定すると簡単です。
-java-home ~/.asdf/installs/java/corretto-11.0.13.8.1/
ちなみにJVMのバージョンが一致しないと以下のようなエラーメッセージが出力されます。
--jvm_3_out: java.lang.UnsupportedClassVersionError: kalix/Annotations has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0 | => cat java.lang.ClassLoader.defineClass1(Native Method) # あるいはこちら --jvm_3_out: java.lang.UnsupportedClassVersionError: kalix/Annotations
Main.scalaを修正する
Main#mainでは非同期にサービスを起動したあと待機していないのですぐに終了してしまいます。
以下のように修正します。これは公式で修正されるのを期待したいところです。
def main(args: Array[String]): Unit = { log.info("starting the Kalix service") Await.ready( createKalix().start(), Duration.Inf ) }
動作確認
コンテナとあわせてsbt runでサービスを起動するとgrpcurlでAPIを実行できます。
API一覧を取得
$ grpcurl -plaintext localhost:9000 list customer.api.CustomerService customer.view.CustomerByEmail customer.view.CustomerByName grpc.reflection.v1alpha.ServerReflection
Customerを作成
$ grpcurl --plaintext -d '{"customer_id": "wip", "email": "[email protected]", "name": "Very Important", "address": {"street": "Road 1", "city": "The Capital"}}' localhost:9000 customer.api.CustomerService/Create { }
Customerを参照
$ grpcurl --plaintext -d '{"customer_id": "wip"}' localhost:9000 customer.api.CustomerService/GetCustomer { "customerId": "wip", "email": "[email protected]", "name": "Very Important" }
その他のスニペットも実行できます。
まとめ
akka serverless 改めkalixのサンプルを手元で動かしてみました。少しとっつきにくいサービスですが人気が出てくればいいなと願っています。